/**
 * 
 */
package talayaco.manager.impl;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import talayaco.dao.AnimalDAO;
import talayaco.dao.CorralDAO;
import talayaco.dao.impl.AnimalDAOImpl;
import talayaco.dao.impl.CorralDAOImpl;
import talayaco.enums.TipoAnimalEnum;
import talayaco.enums.TipoDietaEnum;
import talayaco.manager.GestionCorralesMAN;
import talayaco.utils.MapToVo;
import talayaco.vo.CorralVO;
import talayaco.vo.ReportePesajesVO;

/**
 * @author Lucas
 * 
 */
public class GestionCorralesMANimpl implements GestionCorralesMAN {

	private static CorralDAO corralDAO = new CorralDAOImpl();

	private static AnimalDAO animalDAO = new AnimalDAOImpl();

	/*
	 * (non-Javadoc)
	 * 
	 * @see talayaco.manager.GestionCorralesMAN#insertCorral(java.util.Map)
	 */
	public void insertCorral(String nombreCorral, String tipoCorral)
			throws Exception {
		Map<String, String> corral = new HashMap<String, String>();
		corral.put("nombre", nombreCorral);
		corral.put("tipo", TipoDietaEnum.getIDByDescripcion(tipoCorral));
		corralDAO.insertCorral(corral);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see talayaco.manager.GestionCorralesMAN#updateCorral(java.lang.String,
	 * java.lang.String)
	 */
	@SuppressWarnings("deprecation")
	public void updateCorral(String nombreCorral, String tipoCorral)
			throws Exception {
		Map<String, Object> corral = new HashMap<String, Object>();
		corral.put("nombre", nombreCorral);
		corral.put("tipo", TipoDietaEnum.getIDByDescripcion(tipoCorral));
		Calendar fecha = Calendar.getInstance();
		Date fechaDate = new Date(fecha.get(Calendar.YEAR) - 1900,
				fecha.get(Calendar.MONTH), fecha.get(Calendar.DAY_OF_MONTH));
		corral.put("fechaModificacion", fechaDate);
		corralDAO.updateCorral(corral);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see talayaco.manager.GestionCorralesMAN#deleteCorral(java.lang.String)
	 */
	public void deleteCorral(String corral) throws Exception {
		corralDAO.deleteCorral(corral);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * talayaco.manager.GestionCorralesMAN#getCorralByNombre(java.lang.String)
	 */
	public Map<String, String> getCorralByNombre(String corral)
			throws Exception {

		Map<String, String> datosCorral = new HashMap<String, String>();
		datosCorral = (Map<String, String>) corralDAO.getCorralByNombre(corral);
		return datosCorral;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see talayaco.manager.GestionCorralesMAN#getCorrales()
	 */
	public String[] getNombreCorrales() throws Exception {

		List<String> listadoNombres = new ArrayList<String>();
		listadoNombres = (List<String>) corralDAO.getNombreCorrales();
		String[] arrayNombres = new String[listadoNombres.size() + 1];
		arrayNombres[0] = "Seleccione Corral";
		for (int i = 1; i <= listadoNombres.size(); i++) {
			arrayNombres[i] = listadoNombres.get(i - 1);
		}

		return arrayNombres;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see talayaco.manager.GestionCorralesMAN#getNombreCorralesReporte()
	 */
	public String[] getNombreCorralesReporte() throws Exception {

		List<String> listadoNombres = new ArrayList<String>();
		listadoNombres = (List<String>) corralDAO.getNombreCorrales();
		String[] arrayNombres = new String[listadoNombres.size() + 2];
		arrayNombres[0] = "Todos";
		for (int i = 1; i <= listadoNombres.size(); i++) {
			arrayNombres[i] = listadoNombres.get(i - 1);
		}

		return arrayNombres;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see talayaco.manager.GestionCorralesMAN#existeCorral(java.lang.String)
	 */
	public Boolean existeCorral(String nombre) throws Exception {
		String existe = new String();
		existe = (String) corralDAO.existeCorral(nombre);
		if (existe.equals("1"))
			return true;
		else
			return false;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * talayaco.manager.GestionCorralesMAN#existePesajeFecha(java.util.Date)
	 */
	public Boolean existePesajeFecha(String fecha) throws Exception {
		String existe = (String) corralDAO.existePesajeFecha(fecha);
		if (existe.equals("0"))
			return false;
		else
			return true;

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * talayaco.manager.GestionCorralesMAN#getTipoAnimalByNombre(java.lang.String
	 * )
	 */
	public String getTipoAnimalByNombre(String nombre) throws Exception {
		String idTipoDietaCorral = corralDAO.getTipoAnimalByNombre(nombre);
		return TipoDietaEnum.valueOf(idTipoDietaCorral).getDescripcion();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * talayaco.manager.GestionCorralesMAN#insertPesajes(java.lang.String[][])
	 */
	public void insertPesajes(String[][] datosPesajes, Date fechaDate)
			throws Exception {

		int cantidadCorrales = corralDAO.getNombreCorrales().size();
		for (int i = 0; i < cantidadCorrales; i++) {
			Map<String, String> corral = corralDAO
					.getCorralByNombre(datosPesajes[i][0]);
			Long cantidadAnimales = 0L;
			if (corral.get("tipo").equals(TipoDietaEnum.H.getId())) {
				cantidadAnimales = corralDAO.getCantidadAnimalesEnCorral(corral
						.get("id"));
			}
			corralDAO.insertPesajes(corral.get("id"), datosPesajes[i][1],
					fechaDate, cantidadAnimales);
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * talayaco.manager.GestionCorralesMAN#updateMovimientoByCaravana(java.util
	 * .Map)
	 */
	public void updateMovimientoByCaravana(Map<String, String> datosAnimal)
			throws Exception {
		datosAnimal
				.put("corralDestino", corralDAO.getIdCorralByNombre(datosAnimal
						.get("corralDestino")));
		corralDAO.updateMovimientoByCaravana(datosAnimal);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * talayaco.manager.GestionCorralesMAN#updateCorralAnimal(java.util.Map)
	 */
	public void updateCorralAnimal(Map<String, String> datosAnimal)
			throws Exception {

		if (!talayaco.utils.StringUtils.isNullOrBlank(datosAnimal
				.get("corralOrigen")))
			datosAnimal.put("corralOrigen", corralDAO
					.getIdCorralByNombre(datosAnimal.get("corralOrigen")));

		datosAnimal
				.put("corralDestino", corralDAO.getIdCorralByNombre(datosAnimal
						.get("corralDestino")));

		datosAnimal.put("tipoAnimal",
				TipoAnimalEnum.getId((datosAnimal.get("tipoAnimal"))));

		List<Long> idAnimales = animalDAO.getIdsAnimales(datosAnimal);
		Map<String, String> datosActualizacion = new HashMap<String, String>();
		for (int i = 0; i < Integer.parseInt(datosAnimal.get("cantidad")); i++) {
			datosActualizacion
					.put("idCorral", datosAnimal.get("corralDestino"));
			datosActualizacion.put("idAnimal", idAnimales.get(i).toString());
			corralDAO.updateCorralMovimiento(datosActualizacion);
		}
	}

	public Boolean existeDatosCorral(String nombre) throws Exception {
		Long cantidad = corralDAO.cantidadDatosCorral(nombre);
		if (cantidad == 0) {
			return Boolean.FALSE;
		} else
			return Boolean.TRUE;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see talayaco.manager.GestionCorralesMAN#getReporteCorrales()
	 */
	public List<CorralVO> getReporteCorrales() throws Exception {

		List<Map<String, String>> corrales = corralDAO.getCorrales();
		List<CorralVO> corralesVO = new ArrayList<CorralVO>();
		for (Map<String, String> corral : corrales) {
			Long cantidad = corralDAO.getCantidadAnimalesEnCorral(corral
					.get("id"));
			CorralVO corralVO = new CorralVO();
			corralVO = MapToVo.toCorralVO(corral, cantidad);
			corralesVO.add(corralVO);
		}

		return corralesVO;
	}

	public List<ReportePesajesVO> getReportePesajes(String nombre,
			Date fechaDesde, Date fechaHasta) throws Exception {
		List<ReportePesajesVO> pesajesVO = new ArrayList<ReportePesajesVO>();

		List<Map<String, String>> datosReporte = corralDAO.getReportePesajes(
				fechaDesde, fechaHasta, nombre);
		for (Map<String, String> dato : datosReporte) {
			ReportePesajesVO reportePesajeVO = new ReportePesajesVO();
			reportePesajeVO = MapToVo.mapToReportePesaje(dato);
			pesajesVO.add(reportePesajeVO);
		}

		return pesajesVO;
	}

}
